// MIR for `main` after SimplifyCfg-elaborate-drops

fn main() -> () {
    let mut _0: ();
    let mut _1: i32;
    let _2: ();
    let mut _4: &Test;
    let _5: Test;
    let mut _6: &mut i32;
    let mut _7: &mut i32;
    let mut _9: &mut i32;
    let mut _12: *mut i32;
    let mut _14: {closure@main::{closure#0}};
    let mut _16: for<'a> fn(&'a i32) -> &'a i32;
    let mut _17: &i32;
    let _18: &i32;
    let _19: &i32;
    let mut _20: &Test;
    let _21: Test;
    let mut _22: &i32;
    let _23: &i32;
    let _24: i32;
    let mut _26: *const i32;
    let _27: ();
    scope 1 {
        debug x => _1;
        let _3: &mut i32;
        let _13: for<'a> fn(&'a i32) -> &'a i32;
        scope 2 {
            debug v => _3;
            let _8: &mut i32;
            scope 3 {
                debug w => _8;
                let _10: &mut i32;
                scope 4 {
                    debug w => _10;
                    let _11: *mut i32;
                    scope 5 {
                        debug _w => _11;
                    }
                }
            }
        }
        scope 6 {
            debug c => _13;
            let _15: &i32;
            scope 7 {
                debug _w => _15;
                let _25: *const i32;
                let mut _28: &i32;
                scope 8 {
                    debug _w => _25;
                }
            }
        }
    }

    bb0: {
        StorageLive(_1);
        _1 = const 0_i32;
        StorageLive(_2);
        StorageLive(_3);
        StorageLive(_4);
        StorageLive(_5);
        _5 = Test(const 0_i32);
        _4 = &_5;
        StorageLive(_6);
        StorageLive(_7);
        _7 = &mut _1;
        _6 = &mut (*_7);
        _3 = Test::foo(move _4, move _6) -> [return: bb1, unwind: bb8];
    }

    bb1: {
        Retag(_3);
        StorageDead(_6);
        StorageDead(_4);
        StorageDead(_7);
        drop(_5) -> [return: bb2, unwind: bb9];
    }

    bb2: {
        StorageDead(_5);
        StorageLive(_8);
        StorageLive(_9);
        _9 = move _3;
        Retag(_9);
        _8 = &mut (*_9);
        StorageDead(_9);
        StorageLive(_10);
        _10 = move _8;
        Retag(_10);
        StorageLive(_11);
        StorageLive(_12);
        _12 = &raw mut (*_10);
        _11 = _12;
        StorageDead(_12);
        _2 = const ();
        StorageDead(_11);
        StorageDead(_10);
        StorageDead(_8);
        StorageDead(_3);
        StorageDead(_2);
        StorageLive(_13);
        StorageLive(_14);
        _14 = {closure@main::{closure#0}};
        Retag(_14);
        _13 = move _14 as for<'a> fn(&'a i32) -> &'a i32 (PointerCoercion(ClosureFnPointer(Normal)));
        StorageDead(_14);
        StorageLive(_15);
        StorageLive(_16);
        _16 = _13;
        StorageLive(_17);
        StorageLive(_18);
        _18 = &_1;
        _17 = &(*_18);
        _15 = move _16(move _17) -> [return: bb3, unwind continue];
    }

    bb3: {
        Retag(_15);
        StorageDead(_17);
        StorageDead(_16);
        StorageDead(_18);
        StorageLive(_19);
        StorageLive(_20);
        StorageLive(_21);
        _21 = Test(const 0_i32);
        _20 = &_21;
        StorageLive(_22);
        StorageLive(_23);
        _28 = const _;
        Retag(_28);
        _23 = &(*_28);
        _22 = &(*_23);
        _19 = Test::foo_shr(move _20, move _22) -> [return: bb4, unwind: bb7];
    }

    bb4: {
        Retag(_19);
        StorageDead(_22);
        StorageDead(_20);
        StorageDead(_23);
        drop(_21) -> [return: bb5, unwind: bb9];
    }

    bb5: {
        StorageDead(_21);
        StorageDead(_19);
        StorageLive(_25);
        StorageLive(_26);
        _26 = &raw const (*_15);
        _25 = _26;
        StorageDead(_26);
        StorageLive(_27);
        _27 = array_casts() -> [return: bb6, unwind continue];
    }

    bb6: {
        StorageDead(_27);
        _0 = const ();
        StorageDead(_25);
        StorageDead(_15);
        StorageDead(_13);
        StorageDead(_1);
        return;
    }

    bb7 (cleanup): {
        drop(_21) -> [return: bb9, unwind terminate(cleanup)];
    }

    bb8 (cleanup): {
        drop(_5) -> [return: bb9, unwind terminate(cleanup)];
    }

    bb9 (cleanup): {
        resume;
    }
}
